perm filename CORSER.SAI[PIC,HE] blob sn#424537 filedate 1979-03-07 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002
C00008 ENDMK
C⊗;
COMMENT
	THIS IS CORSER.SAI[A700LE03].
	L. ERMAN	1-4-71
	L.ERMAN 13-FEB-72:  ADDED CHECKING IN RELCORE FOR BAD ADDRESS.
	L ERMAN 10-APR-72: BLIT,SMEAR,AND GETZCORE ADDED.
;


IFC NOT DECLARATION(CORSERSW!)
THENC
	DEFINE	CORSERSW! "[]"=[];


IFC NOT DECLARATION(BAYSAISW!)
THENC

ENTRY GETCORE,RELCORE,BLIT,SMEAR,GETZCORE,COREHANDLE,BUFSIZ,BUFVAL,BUFPUT;
BEGIN  "CORSER"
	REQUIRE "BAYSAI.SAI" SOURCE!FILE;
	LET	CORSER!TERNAL=INTERNAL;
	DEFINE	CORSERBLOC!=TRUE;

ELSEC

	LET	CORSER!TERNAL=EXTERNAL;
	DEFINE	CORSERBLOC!=FALSE;
	IFCR HISEGGING>0 THENC 
	 ELSEC IFCR HISEGGING<0 THENC  ENDC ENDC;

ENDC


CORSER!TERNAL INTEGER SIMPLE PROCEDURE COREHANDLE(INTEGER GET,ARG,FLAG);				! COREHANDLE;
IFC CORSERBLOC! THENC
BEGIN "COREHANDLE"
	INTEGER ANSW;
	EXTERNAL INTEGER CORGET,CORREL,GOGTAB;
	DEFINE	THIS=2,	SIZ=3,	P='17,
		USER='15,	XX=4,		YY=5;

	SIMPLE PROCEDURE BADREL;
	USERERR(0,1,"COREHANDLE: RETURNING BAD BLOCK. ADDR="&CVOS(ANSW));


	IF GET
	THEN BEGIN "GETIT"
		START!CODE
			MOVE	USER,GOGTAB;	! FOR SAFETY;
			MOVE	SIZ,ARG;
			PUSHJ	P,CORGET;
			SETZM	THIS;		! CAN'T GET IT;
			MOVEM	THIS,ANSW;
		END;
		IF ANSW=0 AND FLAG THEN
			USERERR(0,1,"CORSER: CAN'T GET "&CVS(ARG)&" WORDS OF CORE.");
		RETURN(ANSW);
	END "GETIT"
	ELSE START!CODE "GIVIT"
		MOVE	USER,GOGTAB;
		MOVE	THIS,ARG;
	! LET'S FIRST DO SOME ERROR CHECKING;
		MOVEM	THIS,ANSW;	! FOR ERROR MESSAGE;
		MOVN	XX,-1(THIS);	! BLOCK SIZE;
		SKIPG	XX;		! BETTER BE >0;
		PUSHJ	P,BADREL;	!  NO!;
		ADDI	XX,-3(THIS);	! ADDR OF END OF BLOCK;
		MOVEI	YY,-2(THIS);	! ADDR OF HEAD;
		TLO	YY,'400000;	! USE BIT;
		CAME	YY,(XX);	! MATCH?;
		PUSHJ	P,BADREL;	!  NO!;
	! NOW GIVE UP THE BLOCK;
		PUSHJ	P,CORREL;
	END "GIVIT";
END "COREHANDLE";
ENDC

CORSER!TERNAL INTEGER SIMPLE PROCEDURE GETCORE(INTEGER AMT);						! GETCORE;
IFC CORSERBLOC! THENC
	COREHANDLE(TRUE,AMT,TRUE);
ENDC

CORSER!TERNAL SIMPLE PROCEDURE RELCORE(INTEGER WHR);							! RELCORE;
IFC CORSERBLOC! THENC
	COREHANDLE(FALSE,WHR,TRUE);
ENDC

CORSER!TERNAL SIMPLE PROCEDURE BLIT(INTEGER TOO,FROM,LENG);					! BLIT;
IFC CORSERBLOC! THENC
IF LENG>0 THEN
START!CODE "BLIT"	! THIS DOES A BLT;
	HRLZ	1,FROM;
	HRR	1,TOO;
	HRRZ	2,TOO;
	ADD	2,LENG;
	SUBI	2,1;
	BLT	1,@ 2;
END "BLIT";
ENDC

CORSER!TERNAL SIMPLE PROCEDURE SMEAR(INTEGER STRT,LENG,VAL);					! SMEAR;
IFC CORSERBLOC! THENC
IF LENG>0 THEN BEGIN "SMEAR"
	! THIS SMEARS VAL OVER LENG LOCATIONS, STARTING AT STRT (WHICH IS
	AN INT VRBL THAT CONTAINS THE DESIRED ADDRESS);
	START!CODE	MOVE	0,VAL;	MOVEM	0,@ STRT;	END;
	BLIT(STRT+1,STRT,LENG-1);
END "SMEAR";
ENDC

CORSER!TERNAL INTEGER SIMPLE PROCEDURE GETZCORE(INTEGER AMT);						! GETZCORE;
IFC CORSERBLOC! THENC
BEGIN "GETZCORE"	INTEGER WHR;
	WHR←GETCORE(AMT);
	IF WHR≠0 THEN SMEAR(WHR,AMT,0);
	RETURN(WHR);
END "GETZCORE";
ENDC

CORSER!TERNAL INTEGER SIMPLE PROCEDURE BUFSIZ(INTEGER ADDRES);
IFC CORSERBLOC! THENC
START!CODE
 MOVE 1,ADDRES;
 MOVN 1,-1(1);
 END;
ENDC

CORSER!TERNAL INTEGER SIMPLE PROCEDURE BUFVAL(INTEGER ADDRES);
IFC CORSERBLOC! THENC
 START!CODE
  MOVE 1,ADDRES;
  MOVE 1,(1)
 END;
ENDC

CORSER!TERNAL INTEGER SIMPLE PROCEDURE BUFPUT(INTEGER ADDRES,VAL);
IFC CORSERBLOC! THENC
 START!CODE
  MOVE 1,VAL;
  MOVE 2,ADDRES;
  MOVEM 1,(2)
 END;
ENDC


IFC CORSERBLOC! THENC
END    "CORSER"
ENDC


ENDC



! END OF CORSER.SAI[A700LE03];